
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.InputStream;

public class ReadFile {
    /**
     * 构造函数
     */
    //public void ReadFile() {

   // }
/*
    public static void main(String[] args) {
        String fileName = "D:\\javaName.txt";
        String imgName = "D:\\javaimg.png";
        //readFile(fileName);
        readFileBytes(fileName);
    }
*/
    /**
     * 以行为单位读取文件
     */
    public  void readFile(String fileName) {
        //根据目录，创建一个File实例
        File file = new File(fileName);
        BufferedReader reader = null;
        try {
            System.out.println("以行为单位读取文件内容，一次读一整行：");
            //FileReader(File file) ,创建一个新的FileReader，从给定的文件读取。
            //BufferedReader 类从字符输入流中读取文本，缓冲各个字符，从而提供字符，数组和行的高效读取。
            //BufferedReader(Reader in) 这将创建一个使用默认大小输入缓冲区的缓冲字符输入流。
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行，直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                System.out.println("line " + line + ": " + tempString);
                line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 以字节为单位，读取文件，图片、声音、影像等文件
     * 使用FileInputStream读取诸如图像等【字节】数据的读出
     */
    public  void readFileBytes(String fileName) {
        File file = new File(fileName);
        //nputStream 类是表示字节输入流的所有类的超类
        InputStream in = null;
        //以字节为单位读取文件内容，一次读一个字节
        try {
            System.out.println("以字节为单位读取文件内容，一次读一个字节：");
            // 一次读一个字节
            //FileInputStream 类从文件系统中的一个文件中获取输入字节。 对于字符读取流，使用FileReader。
            // 这个类是指对原始字节诸如图像数据读出流。
            in = new FileInputStream(file);
            int tempbyte;
            //in.read() 方法读取当前输入流中一个字节的数据
            while ((tempbyte = in.read()) != -1) {
                System.out.println(tempbyte);
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        //以字节为单位读取文件内容，一次读多个字节
        try {
            System.out.println("以字节为单位读取文件内容，一次读多个字节：");
            // 一次读多个字节
            byte[] tempbytes = new byte[100];
            int byteread = 0;
            in = new FileInputStream(fileName);
          //  ReadFile.showAvailableBytes(in);
            // 读入多个字节到字节数组中，byteread为一次读入的字节数
            while ((byteread = in.read(tempbytes)) != -1) {
                //好方法，第一个参数是数组，第二个参数是开始位置，第三个参数是长度
                System.out.write(tempbytes, 0, byteread);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 显示输入流中还剩的字节数
     */
    private  void showAvailableBytes(InputStream in) {
        try {
            System.out.println("当前字节输入流中的字节数为:" + in.available());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 以字符为单位读取文件，常用于读文本，数字等类型的文件
     *字符读取流，使用FileReader
     */


}

